PHP中strtr函数 源码分析
PHP String 函数
定义和用法
strtr() 函数转换字符串中特定的字符。
语法
strtr(string,from,to)
或者
strtr(string,array)
参数描述
string1 必需。规定要转换的字符串。
from 必需(除非使用数组)。规定要改变的字符。
to 必需(除非使用数组)。规定要改变为的字符。
array 必需(除非使用 from 和 to)。一个数组,其中的键是原始字符,值是目标字符。
说明
如果 from 和 to 的长度不同,则格式化为最短的长度。 例子
例子 1
<?php
echo strtr("Hilla Warld","ia","eo");
?>
输出:
Hello World
例子 2
<?php
$arr = array("Hello" => "Hi", "world" => "earth");
echo strtr("Hello world",$arr);
?>
输出:
Hi earth
strtr函数实现的方法文件目录是 \php-5.4.40-src\ext\standard\string.c
第2774行
/* {{{ php_strtr
*/
PHPAPI char *php_strtr(char *str, int len, char *str_from, char *str_to, int trlen)
{
int i;
unsigned char xlat[256];
if ((trlen < 1) || (len < 1)) {
return str;
}
for (i = 0; i < 256; xlat[i] = i, i++);
for (i = 0; i < trlen; i++) {
xlat[(unsigned char) str_from[i]] = str_to[i];
}
for (i = 0; i < len; i++) {
str[i] = xlat[(unsigned char) str[i]];
}
return str;
}
/* }}} */
整个函数是对于256个字符进行hash替换,这256个字符中当然包括大小写字母啦 它是对每个字符进行对应替换,是以字符为单位,所以替换的是字符,而不是字符串。
echo strtr("I Love you","Lo","lO");
得到的结果是
I lOve yOu
这个结果提醒我们
- strtr它是区分大小写的
echo strtr("I Love you","Love","");
结果是
I Love you
什么也不会改变,所以strtr需要注意的是:不能被替换为空,也就是末位那个参数不能是空字符串,当然空格是可以的。
php_strtr(Z_STRVAL_P(return_value),
Z_STRLEN_P(return_value),
Z_STRVAL_PP(from),
to,
MIN(Z_STRLEN_PP(from),
to_len));
MIN(Z_STRLEN_PP(from), Z_STRLEN_PP(to))
是取from
和to
两个字符串的长度中最小的,从php_strtr
函数中我们可以看到
if ((trlen < 1) || (len < 1)) {
return str;
}
当长度小于1时返回原来的字符串。所以。。。。
echo strtr("I Loves you","Love","lOvEA");
结果是
I lOvEs yOu
注意看第三个参数的A,在结果中并没有出现。